package com.stlm2.controller.pay;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.stlm2.dems.entity.*;
import com.stlm2.dems.recharge.entity.Recharge;
import com.stlm2.dems.recharge.service.RechargeService;
import com.stlm2.dems.service.GoodsOrderService;
import com.stlm2.dems.service.PayConfigService;
import com.stlm2.dems.service.PurchaseOrderService;
import com.stlm2.dems.service.UserService;
import com.stlm2.util.DataSourceUtil;
import com.stlm2.util.codecontent.CodeContent;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Author: fuchunyu
 * Date: 2017/7/7
 * Description：支付宝支付
 */
@Controller
@RequestMapping("/ali")
public class AlipayController {
    @Resource
    private RechargeService rechargeService;
    @Resource
    private UserService userService;
    @Resource
    private PurchaseOrderService purchaseOrderService;
    @Resource
    private GoodsOrderService goodsOrderService;
    @Resource
    private PayConfigService payConfigService;


    /*流量充值支付*/

    @RequestMapping("rechargePay.json")
    public String AliPay(String companyCode, HttpServletResponse response, ModelMap map, String token, String money, String code, String fluxId,String flux,String mark,String phone){
        User user=userService.getByToken(token);
        if(user==null){
            map.put("code", -1);
            map.put("msg", "用户未登陆");
            return new JSONObject(map).toString();
        }

        if(StringUtils.isEmpty(companyCode))
            companyCode="1";
        PayConfig payConfig=payConfigService.getByCodeChannel(companyCode, PayChannel.Alipay);
        Recharge order=null;
        if(StringUtils.isEmpty(code)){
            order=rechargeService.addRecharge(user.getId(),money,Integer.parseInt(fluxId),Integer.parseInt(flux),phone);
        }else {
            order=rechargeService.getByCode(code);
        }

        // 商户订单号，商户网站订单系统中唯一订单号，必填
        String out_trade_no = order.getCode();
        // 订单名称，必填
        String subject ="现金充值";
        System.out.println(subject+"，订单号："+out_trade_no);
        // 付款金额，必填
        String total_amount=order.getMoney().toString();
        // 商品描述，可空
        String body = mark+","+companyCode;
        // 超时时间 可空
        String timeout_express="2m";
        // 销售产品码 必填
        String product_code="QUICK_WAP_PAY";
        /**********************/
        // SDK 公共请求类，包含公共请求参数，以及封装了签名与验签，开发者无需关注签名与验签
        //调用RSA签名方式
        AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, payConfig.getAppId(), payConfig.getRsaPrivateKey(), AlipayConfig.FORMAT, AlipayConfig.CHARSET, payConfig.getAlipayPublicKey(), AlipayConfig.SIGNTYPE);
        AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();

        // 封装请求支付信息
        AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
        model.setOutTradeNo(out_trade_no);
        model.setSubject(subject);
        model.setTotalAmount(total_amount);
        model.setBody(body);
        model.setTimeoutExpress(timeout_express);
        model.setProductCode(product_code);
        alipay_request.setBizModel(model);
        // 设置异步通知地址
        alipay_request.setNotifyUrl("http://ddt.chinaddcat.com/ali/rechargeNotify.json");
        // 设置同步地址
        alipay_request.setReturnUrl(AlipayConfig.return_url);

        // form表单生产
        String form = "";
        try {
            // 调用SDK生成表单
            form = client.pageExecute(alipay_request).getBody();
            response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
            response.getWriter().write(form);//直接将完整的表单html输出到页面
            response.getWriter().flush();
            response.getWriter().close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "success";
    }



    /**
     * Author：fuchunyu
     * Date：2017/9/4
     * Description：APP支付接口
     */

    @ResponseBody
    @RequestMapping("rechargePayApp.json")
    public String payApp(String companyCode,ModelMap map, String token, String money,String code,String fluxId,String flux,String mark,String phone){
        User user=userService.getByToken(token);
        if(user==null){
            map.put("code", -1);
            map.put("msg", "用户未登陆");
            return new JSONObject(map).toString();
        }

        if(!NumberUtils.isDigits(companyCode))
            return CodeContent.returnFailure("非法的companyCode");
        PayConfig payConfig=payConfigService.getByCodeChannel(companyCode, PayChannel.Alipay);
        Recharge order=null;
        if(StringUtils.isEmpty(code)){
            order=rechargeService.addRecharge(user.getId(),money,Integer.parseInt(fluxId),Integer.parseInt(flux),phone);
        }else {
            order=rechargeService.getByCode(code);
        }

        // 商户订单号，商户网站订单系统中唯一订单号，必填
        String out_trade_no = order.getCode();
        // 订单名称，必填
        String subject ="积分充值";
        System.out.println(subject+"，订单号："+out_trade_no);
        // 付款金额，必填
        String total_amount=order.getMoney().toString();
        // 商品描述，可空
        String body = mark+","+companyCode;
        // 超时时间 可空
        String timeout_express="2m";
        // 销售产品码 必填
        String product_code="QUICK_MSECURITY_PAY";
        /**********************/
        // SDK 公共请求类，包含公共请求参数，以及封装了签名与验签，开发者无需关注签名与验签
        //调用RSA签名方式
        AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, payConfig.getAppId(), payConfig.getRsaPrivateKey(), AlipayConfig.FORMAT, AlipayConfig.CHARSET, payConfig.getAlipayPublicKey(), AlipayConfig.SIGNTYPE);
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        // 封装请求支付信息
        model.setBody(body);;  //描述信息  添加附加数据
        model.setSubject(subject); //商品标题
        model.setOutTradeNo(out_trade_no); //商家订单编号
        model.setTimeoutExpress(timeout_express); //超时关闭该订单时间
        model.setTotalAmount(total_amount);  //订单总金额
        model.setProductCode(product_code); //销售产品码，商家和支付宝签约的产品码，为固定值QUICK_MSECURITY_PAY
        request.setBizModel(model);
        request.setNotifyUrl("http://ddt.chinaddcat.com/ali/rechargeNotify.json");  //回调地址

        try {
            AlipayTradeAppPayResponse response= client.sdkExecute(request);
            //System.out.println(response.getBody());
            return CodeContent.returnSuccess(response.getBody());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return CodeContent.returnFailure("充值失败！");
    }


    /**
     * Author：fuchunyu
     * Date：2017/9/4
     * Description：支付回调接口
     */
    @RequestMapping("/rechargeNotify.json")
    public void rechargeNotify(String companyCode, HttpServletRequest request, HttpServletResponse response)throws IOException {
        //获取支付宝POST过来反馈信息
        System.out.println("支付宝开始回调！");
        PrintWriter out = response.getWriter();
        Map<String,String> params = new HashMap<String,String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }
        //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
        //商户订单号

        String out_trade_no = new String(request.getParameter("out_trade_no"));
        //支付宝交易号

        String trade_no = new String(request.getParameter("trade_no"));

        //交易状态
        String trade_status = new String(request.getParameter("trade_status"));

        //订单金额
        String total_amount = new String(request.getParameter("total_amount"));

        //订单详情
        String body=new String(request.getParameter("body"));

        System.out.println("支付宝回调获取的body内容:"+body);
        PayChannel payChannel=  PayChannel.getByIntValue(3);
        String bodys[]=body.split(",");
        if (bodys[0] != null && NumberUtils.isDigits(bodys[0])) {
            payChannel = PayChannel.getByIntValue(Integer.parseInt(bodys[0]));
            System.out.println("支付宝支付方式:" + payChannel.toString());
        }
        Boolean flag;
        if(NumberUtils.isDigits(bodys[1]))
            flag= DataSourceUtil.changeDataSource(bodys[1]);
        else
            flag=DataSourceUtil.changeDataSource(String.valueOf(1));
        System.out.println("回调切换数据源"+flag);

        //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
        //计算得出通知验证结果
        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        boolean verify_result = false;
        try {
            verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        System.out.println("验证之前：out_trade_no:"+out_trade_no+",trade_no:"+trade_no+",trade_status:"+trade_status);
        if(verify_result){//验证成功
            System.out.println("验证成功！");
            //////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            if(trade_status.equals("TRADE_FINISHED")){
                System.out.println("TRADE_FINISHED");
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理，不执行商户的业务程序
                System.out.println("订单已完成："+out_trade_no);
                //注意：
                //如果签约的是可退款协议，退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
                //如果没有签约可退款协议，那么付款完成后，支付宝系统发送该交易状态通知。
            } else if (trade_status.equals("TRADE_SUCCESS")){
                System.out.println("TRADE_SUCCESS");
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理，不执行商户的业务程序
                Recharge order=rechargeService.getByCode(out_trade_no);
                System.out.println("获取order"+order.getCode());
                if(order==null){
                    System.out.println("找不到订单号："+out_trade_no);
                }
                //支付订单校验，防止交易金额与订单金额不符。
                if(order.getMoney().doubleValue()==Double.parseDouble(total_amount)){
                    System.out.println("支付校验成功，订单金额为："+order.getMoney().doubleValue()+"，支付金额为："+Double.parseDouble(total_amount));
                    Recharge recharge = rechargeService.pay(order,trade_no,payChannel);
                    System.out.println("支付成功的recharge"+recharge.getOrderState().toString());
                    if(recharge.getOrderState().getIntValue()== OrderState.Payment.getIntValue()){
                        System.out.println("支付成功！！！！！----交易金额为："+total_amount);
                        out.flush();
                        out.println("success");
                        out.write("success");
                    }
                }else {
                    System.out.println("支付校验失败，订单金额为："+order.getMoney().doubleValue()+"，支付金额为："+Double.parseDouble(total_amount));
                }

                //注意：
                //如果签约的是可退款协议，那么付款完成后，支付宝系统发送该交易状态通知。
            }

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
            System.out.println("验证之后：out_trade_no:"+out_trade_no+",trade_no:"+trade_no+",trade_status:"+trade_status);
            //out.clear();
            //out.println("success");	//请不要修改或删除

            //////////////////////////////////////////////////////////////////////////////////////////
        }else{//验证失败
            System.out.println("验证失败！");
            out.println("fail");
        }
    }



    /*商品购买支付*/

    @ResponseBody
    @RequestMapping(value = "/verifyPay.json",produces = "application/json;charset=utf-8")
    public String verifyPay(String companyCode,String token, String code, String mark){
        User user = userService.getByToken(token);
        if (user == null)
            return CodeContent.returnLogin();
        if (StringUtils.isEmpty(code))
            return CodeContent.returnFailure("非法的订单号！");
        PurchaseOrder purchaseOrder = purchaseOrderService.getByCode(code);
        if (purchaseOrder == null)
            return CodeContent.returnFailure("没有找到订单！");
        if (purchaseOrder.getUserId() - user.getId()!=0)
            return CodeContent.returnFailure("订单不匹配！");
        if(!purchaseOrder.getOrderState().equals(OrderState.Create))
            return CodeContent.returnFailure("不是待支付订单！");
        if (!NumberUtils.isDigits(mark))
            return CodeContent.returnFailure("非法的支付方式！");
        PayChannel payChannel = PayChannel.getByIntValue(Integer.parseInt(mark));
        if (payChannel == null)
            return CodeContent.returnFailure("支付方式为空！");
        return CodeContent.returnSuccess(null);
    }


    /**
     * Author：fuchunyu
     * Date：2017/9/4
     * Description：wap支付接口
     */

    @RequestMapping(value = "pay.json")
    public String AliPay(String companyCode,HttpServletResponse response, String token, String code, String mark) throws IOException {
        User user = userService.getByToken(token);
        if (user == null)
            response.getWriter().write("请登录");
        if (StringUtils.isEmpty(code))
            response.getWriter().write("非法的订单号！");
        PurchaseOrder purchaseOrder = purchaseOrderService.getByCode(code);
        if (purchaseOrder == null)
            response.getWriter().write("没有找到订单！");
        if (purchaseOrder.getUserId() - user.getId()!=0)
            response.getWriter().write("订单不匹配！");
        if (!NumberUtils.isDigits(mark))
            response.getWriter().write("非法的支付方式！");
        if(!purchaseOrder.getOrderState().equals(OrderState.Create))
            response.getWriter().write("不是待支付订单！");
        PayChannel payChannel = PayChannel.getByIntValue(Integer.parseInt(mark));
        if (payChannel == null)
            response.getWriter().write("支付方式为空！");
        if(!NumberUtils.isDigits(companyCode))
            return CodeContent.returnFailure("非法的companyCode");
        PayConfig payConfig=payConfigService.getByCodeChannel(companyCode, PayChannel.Alipay);
        // 商户订单号，商户网站订单系统中唯一订单号，必填
        String out_trade_no = purchaseOrder.getCode();
        // 订单名称，必填
        String subject = "叮当网购买";
        System.out.println(subject + "，订单号：" + out_trade_no);
        // 付款金额，必填
        String total_amount = purchaseOrder.getPayMoney().toString();
        // 商品描述，可空
        String body = mark+","+companyCode;
        // 超时时间 可空
        String timeout_express = "2m";
        // 销售产品码 必填
        String product_code = "QUICK_WAP_PAY";
        /**********************/
        // SDK 公共请求类，包含公共请求参数，以及封装了签名与验签，开发者无需关注签名与验签
        //调用RSA签名方式
        AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, payConfig.getAppId(), payConfig.getRsaPrivateKey(), AlipayConfig.FORMAT, AlipayConfig.CHARSET, payConfig.getAlipayPublicKey(), AlipayConfig.SIGNTYPE);
        AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest();

        // 封装请求支付信息
        AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
        model.setOutTradeNo(out_trade_no);
        model.setSubject(subject);
        model.setTotalAmount(total_amount);
        model.setBody(body);
        model.setTimeoutExpress(timeout_express);
        model.setProductCode(product_code);
        alipay_request.setBizModel(model);
        // 设置异步通知地址
        alipay_request.setNotifyUrl(AlipayConfig.notify_url);
        // 设置同步地址
        alipay_request.setReturnUrl(AlipayConfig.return_url);

        // form表单生产
        String form = "";
        try {
            // 调用SDK生成表单
            form = client.pageExecute(alipay_request).getBody();
            response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
            response.getWriter().write(form);//直接将完整的表单html输出到页面
            response.getWriter().flush();
            response.getWriter().close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return CodeContent.returnSuccess(null);
    }


    /**
     * Author：fuchunyu
     * Date：2017/9/4
     * Description：APP支付接口
     */

    @ResponseBody
    @RequestMapping(value = "payApp.json", produces = "application/json;charset=utf-8")
    public String payApp(String companyCode,ModelMap map, String token, String code, String mark) {
        User user = userService.getByToken(token);
        if (user == null)
            return CodeContent.returnLogin();
        if (StringUtils.isEmpty(code))
            return CodeContent.returnFailure("非法的订单号！");
        PurchaseOrder purchaseOrder = purchaseOrderService.getByCode(code);
        if (purchaseOrder == null)
            return CodeContent.returnFailure("没有找到订单！");
        if (purchaseOrder.getUserId() - user.getId()!=0)
            return CodeContent.returnFailure("订单不匹配！");
        if (!NumberUtils.isDigits(mark))
            return CodeContent.returnFailure("非法的支付方式！");
        if(!purchaseOrder.getOrderState().equals(OrderState.Create))
            return CodeContent.returnFailure("不是待支付订单！");
        PayChannel payChannel = PayChannel.getByIntValue(Integer.parseInt(mark));
        if (payChannel == null)
            return CodeContent.returnFailure("支付方式为空！");
        if(!NumberUtils.isDigits(companyCode))
            return CodeContent.returnFailure("非法的companyCode");
        PayConfig payConfig=payConfigService.getByCodeChannel(companyCode,PayChannel.Alipay);
        // 商户订单号，商户网站订单系统中唯一订单号，必填
        String out_trade_no = purchaseOrder.getCode();
        // 订单名称，必填
        String subject = "叮当网购买";
        System.out.println(subject + "，订单号：" + out_trade_no);
        // 付款金额，必填
        String total_amount = purchaseOrder.getPayMoney().toString();
        // 商品描述，可空
        String body = mark+","+companyCode;
        // 超时时间 可空
        String timeout_express = "2m";
        // 销售产品码 必填
        String product_code = "QUICK_MSECURITY_PAY";
        /**********************/
        // SDK 公共请求类，包含公共请求参数，以及封装了签名与验签，开发者无需关注签名与验签
        //调用RSA签名方式
        AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, payConfig.getAppId(), payConfig.getRsaPrivateKey(), AlipayConfig.FORMAT, AlipayConfig.CHARSET, payConfig.getAlipayPublicKey(), AlipayConfig.SIGNTYPE);
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        // 封装请求支付信息
        model.setBody(body);
        ;  //描述信息  添加附加数据
        model.setSubject(subject); //商品标题
        model.setOutTradeNo(out_trade_no); //商家订单编号
        model.setTimeoutExpress(timeout_express); //超时关闭该订单时间
        model.setTotalAmount(total_amount);  //订单总金额
        model.setProductCode(product_code); //销售产品码，商家和支付宝签约的产品码，为固定值QUICK_MSECURITY_PAY
        request.setBizModel(model);
        request.setNotifyUrl(AlipayConfig.notify_url);  //回调地址

        try {
            AlipayTradeAppPayResponse response = client.sdkExecute(request);
            //System.out.println(response.getBody());
            return CodeContent.returnSuccess(response.getBody());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return CodeContent.returnFailure("购买失败！");
    }


    /**
     * Author：fuchunyu
     * Date：2017/9/4
     * Description：支付回调接口
     */
    @RequestMapping("/notify.do")
    public void AliPayNotify(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //获取支付宝POST过来反馈信息
        System.out.println("支付宝开始回调！");
        PrintWriter out = response.getWriter();
        Map<String, String> params = new HashMap<String, String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }
        //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
        //商户订单号

        String out_trade_no = new String(request.getParameter("out_trade_no"));
        //支付宝交易号

        String trade_no = new String(request.getParameter("trade_no"));

        //交易状态
        String trade_status = new String(request.getParameter("trade_status"));

        //订单金额
        String total_amount = new String(request.getParameter("total_amount"));

        //订单详情
        String body = new String(request.getParameter("body"));

        System.out.println("支付宝回调获取的body内容:" + body);
        PayChannel payChannel = PayChannel.getByIntValue(3);
        String bodys[]=body.split(",");
        if (bodys[0] != null && NumberUtils.isDigits(bodys[0])) {
            payChannel = PayChannel.getByIntValue(Integer.parseInt(bodys[0]));
            System.out.println("支付宝支付方式:" + payChannel.toString());
        }
        Boolean flag;
        if(NumberUtils.isDigits(bodys[1]))
            flag=DataSourceUtil.changeDataSource(bodys[1]);
        else
            flag=DataSourceUtil.changeDataSource(String.valueOf(1));
        System.out.println("回调切换数据源"+flag);
        PayConfig payConfig=payConfigService.getByCodeChannel(bodys[1],PayChannel.Alipay);

        //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
        //计算得出通知验证结果
        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        boolean verify_result = false;
        try {
            verify_result = AlipaySignature.rsaCheckV1(params, payConfig.getAlipayPublicKey(), AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        System.out.println("验证之前：out_trade_no:" + out_trade_no + ",trade_no:" + trade_no + ",trade_status:" + trade_status);
        if (verify_result) {//验证成功
            System.out.println("验证成功！");
            //////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            if (trade_status.equals("TRADE_FINISHED")) {
                System.out.println("TRADE_FINISHED");
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理，不执行商户的业务程序
                System.out.println("订单已完成：" + out_trade_no);
                //注意：
                //如果签约的是可退款协议，退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
                //如果没有签约可退款协议，那么付款完成后，支付宝系统发送该交易状态通知。
            } else if (trade_status.equals("TRADE_SUCCESS")) {
                System.out.println("TRADE_SUCCESS");
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理，不执行商户的业务程序
                PurchaseOrder order = purchaseOrderService.getByCode(out_trade_no);
                System.out.println("获取order" + order.getCode());
                if (order == null) {
                    System.out.println("找不到订单号：" + out_trade_no);
                }
                //支付订单校验，防止交易金额与订单金额不符。
                if (order.getPayMoney().doubleValue() == Double.parseDouble(total_amount)) {
                    System.out.println("支付校验成功，订单金额为：" + order.getPayMoney().doubleValue() + "，支付金额为：" + Double.parseDouble(total_amount));
                    PurchaseOrder purchaseOrder=null;
                    try {
                        purchaseOrder = goodsOrderService.pay(order, payChannel, trade_no,bodys[1]);
                        System.out.println("支付成功的" + purchaseOrder.getOrderState().toString());
                        if (purchaseOrder.getOrderState().getIntValue() == OrderState.Payment.getIntValue()) {
                            System.out.println("支付成功！！！！！----交易金额为：" + total_amount);
                            out.write("success");
                        }
                    }catch (Exception e){
                        System.out.println("订单"+purchaseOrder.getCode()+"支付失败，原因："+e.getMessage());
                    }

                } else {
                    System.out.println("支付校验失败，订单金额为：" + order.getPayMoney().doubleValue() + "，支付金额为：" + Double.parseDouble(total_amount));
                    out.println("fail");
                }

                //注意：
                //如果签约的是可退款协议，那么付款完成后，支付宝系统发送该交易状态通知。
            }

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
            System.out.println("验证之后：out_trade_no:" + out_trade_no + ",trade_no:" + trade_no + ",trade_status:" + trade_status);
            //out.println("success");	//请不要修改或删除

        } else {//验证失败
            System.out.println("验证失败！");
            out.println("fail");
        }
    }

    /**
     * Author：fuchunyu
     * Date：2017/8/31
     * Description：支付宝对帐接口
     */

    @ResponseBody
    @RequestMapping("/test")
    public void test(String companyCode) throws AlipayApiException {
        AlipayClient client = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();

        List<Recharge> list = rechargeService.getAll();
        for (Recharge recharge : list) {
            if (recharge.getTransactionNo() != null && recharge.getPayChannel().getIntValue() == 8) {
                request.setBizContent("{" +
                        "\"out_trade_no\":\"" + recharge.getCode().trim() + "\"," +
                        "\"trade_no\":\"" + recharge.getTransactionNo().trim() + "\"" +
                        "  }");
                AlipayTradeQueryResponse response = client.execute(request);
                if (response.isSuccess()) {
                    double money = recharge.getMoney().doubleValue();
                    double payMoney = Double.parseDouble(response.getTotalAmount());
                    if (money != payMoney) {
                        System.out.println("数据错误的ID：" + recharge.getId() + "，支付金额：" + payMoney + "，订单金额：" + money);
                    }
                } else {
                    System.out.println("调用失败");
                }
            }
        }
    }
}
